First-class function
part 14/20 · 35.2 KB total
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Modern imperative languages often support garbage-collection making the implementation of first-class functions feasible. First-class functions have often only been supported in later revisions of the language, including C# 2.0 and Apple's Blocks extension to C, C++, and Objective-C. C++11 has added support for anonymous functions and closures to the language, but because of the non-garbage collected nature of the language, special care has to be taken for non-local variables in functions to be returned as results (see below).
| Language | Language | Higher-order functions | Higher-order functions | Nested functions | Nested functions | Non-local variables | Non-local variables | Notes |
|---|---|---|---|---|---|---|---|---|
| Language | Language | Arguments | Results | Named | Anonymous | Closures | Partial application | Notes |
| Algol family | ALGOL 60 | Yes | No | Yes | No | Downwards | No | Have function types . |
| Algol family | ALGOL 68 | Yes | Yes [ 8 ] | Yes | Yes | Downwards [ 9 ] | No | Have function types . |
| Algol family | Pascal | Yes | No | Yes | No | Downwards | No | Have function types . |
| Algol family | Ada | Yes | No | Yes | No | Downwards | No | Have function types . |
| Algol family | Oberon | Yes | Non-nested only | Yes | No | Downwards | No | Have function types . |
| Algol family | Delphi | Yes | Yes | Yes | 2009 | 2009 | No | Have function types . |
| C family | C | Yes | Yes | Yes in GNU C | Yes in Clang( Blocks ) | Yes in Clang( Blocks ) | No | Has function pointers . |
| C family | C++ | Yes | Yes | C++11 [ 10 ] | C++11 [ 11 ] | C++11 [ 11 ] | C++11 | Has function pointers, function objects . (Also, see below.) Explicit partial application possible with std::bind . |
| C family | C# | Yes | Yes | 7 | 2.0 / 3.0 | 2.0 | 3.0 | Has delegates (2.0) and lambda expressions (3.0). |
| C family | Objective-C | Yes | Yes | Using anonymous | 2.0 + Blocks [ 12 ] | 2.0 + Blocks | No | Has function pointers. |
| C family | Java | Yes | Yes | Using anonymous | Java 8 | Java 8 | Yes | Has anonymous inner classes . |
| C family | Go | Yes | Yes | Using anonymous | Yes | Yes | Yes [ 13 ] | |
| C family | Limbo | Yes | Yes | Yes | Yes | Yes | No | |
| C family | Newsqueak | Yes | Yes | Yes | Yes | Yes | No | |
| C family | Rust | Yes | Yes | Yes | Yes | Yes | Yes [ 14 ] | |
| Functional languages | Lisp | Syntax | Syntax | Yes | Yes | Common Lisp | No | (see below) |
| Functional languages | Scheme | Yes | Yes | Yes | Yes | Yes | SRFI 26 [ 15 ] | |
| Functional languages | Julia | Yes | Yes | Yes | Yes | Yes | Yes | |
| Functional languages | Clojure | Yes | Yes | Yes | Yes | Yes | Yes | |
| Functional languages | ML | Yes | Yes | Yes | Yes | Yes | Yes | |
| Functional languages | Haskell | Yes | Yes | Yes | Yes | Yes | Yes | |
| Functional languages | jq | Yes | No | Yes | Expressions only | Downwards | No | |
| Functional languages | Scala | Yes | Yes | Yes | Yes | Yes | Yes | |
| Functional languages | Erlang | Yes | Yes | Yes | Yes | Yes | Yes | |
| Functional languages | Elixir | Yes | Yes | Yes | Yes | Yes | Yes | |
| Functional languages | F# | Yes | Yes | Yes | Yes | Yes | Yes | |
| Functional languages | OCaml | Yes | Yes | Yes | Yes | Yes | Yes | |
| Scripting languages | Io | Yes | Yes | Yes | Yes | Yes | No | |
| Scripting languages | JavaScript | Yes | Yes | Yes | Yes | Yes | ECMAScript 5 | Partial application possible with user-land code on ES3 [ 16 ] |
| Scripting languages | Lua | Yes | Yes | Yes | Yes | Yes | Yes [ 17 ] | |
| Scripting languages | PHP | Yes | Yes | Using anonymous | 5.3 | 5.3 | No | Partial application possible with user-land code. |
| Scripting languages | Perl | Yes | Yes | 6 | Yes | Yes | 6 [ 18 ] | |
| Scripting languages | Python | Yes | Yes | Yes | Expressions only | Yes | 2.5 [ 19 ] | (see below) |
| Scripting languages | Ruby | Syntax | Syntax | Unscoped | Yes | Yes | 1.9 | (see below) |
| Other languages | Fortran | Yes | Yes | Yes | No | No | No | |
| Other languages | Maple | Yes | Yes | Yes | Yes | Yes | No | |
| Other languages | Mathematica | Yes | Yes | Yes | Yes | Yes | No | |
| Other languages | MATLAB | Yes | Yes | Yes | Yes [ 20 ] | Yes | Yes | Partial application possible by automatic generation of new functions. [ 21 ] |
| Other languages | Smalltalk | Yes | Yes | Yes | Yes | Yes | Partial | Partial application possible through library. |
| Other languages | Swift | Yes | Yes | Yes | Yes | Yes | Yes | |
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────